package com.bbva.itradecomex.bo.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bbva.itradecomex.bo.iface.RankingPaisesBO;
import com.bbva.itradecomex.dao.iface.VistaBancoDAO;
import com.bbva.itradecomex.domain.BancoRankPaisDetalle;
import com.bbva.itradecomex.domain.BancoRankPaisResultado;
import com.bbva.itradecomex.form.RankingPaisBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;

@Service
public class RankingPaisesBOImpl implements RankingPaisesBO {

	@Autowired
	private VistaBancoDAO vistaBancoDAO;

	@Override
	public List<BancoRankPaisResultado> getListRankingPaisImport(RankingPaisBusquedaForm form) throws Exception {
		return formatListRankingPais(vistaBancoDAO.getListBanoRankPaisDetImp(form));
	}
	@Override
	public List<BancoRankPaisResultado> getListRankingPaisExport(RankingPaisBusquedaForm form)
			throws Exception {
		return formatListRankingPais(vistaBancoDAO.getListBanoRankPaisDetExp(form));
	}

	@Override
	public List<BancoRankPaisResultado> getListRankingPaisImpExp(RankingPaisBusquedaForm form)
			throws Exception {
		return formatListRankingPais(vistaBancoDAO.getListBanoRankPaisDetImpExp(form));
	}
	
	@Override
	public void setearTotales(
			BancoRankPaisResultado subTotalPaisConClaveImp,
			BancoRankPaisResultado subTotalPaisSinClaveImp,
			BancoRankPaisResultado totalPaisImp,
			List<BancoRankPaisResultado> listaBPaisResultadoImportaciones)
			throws Exception {
		// Importaciones
		// SubTotalPaisImpesConCLave && SubTotalPaisImpesSinCLave
		for (BancoRankPaisResultado bRankPaisResIter : listaBPaisResultadoImportaciones) {
			for(BancoRankPaisDetalle bRankPaisDetaIter: bRankPaisResIter.getListaClaves()){
				if(bRankPaisDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_CON_CLAVE)){
					subTotalPaisConClaveImp.setNroCliente(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getNroCliente(),bRankPaisDetaIter.getTotCli()));
					subTotalPaisConClaveImp.setTotalBcos(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getTotalBcos(),bRankPaisDetaIter.getTotBcos()));
					subTotalPaisConClaveImp.setTotalOper(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getTotalOper(),bRankPaisDetaIter.getTotOper()));
					subTotalPaisConClaveImp.setTotalImporte(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getTotalImporte(),bRankPaisDetaIter.getTotImporte()));
					subTotalPaisConClaveImp.setiTeBcos(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiTeBcos(),bRankPaisDetaIter.getTxBcos()));
					subTotalPaisConClaveImp.setiTeOper(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiTeOper(),bRankPaisDetaIter.getTxOper()));
					subTotalPaisConClaveImp.setiTeImpUSD(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiTeImpUSD(),bRankPaisDetaIter.getTxImporte()));
					subTotalPaisConClaveImp.setiCcBcos(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCcBcos(),bRankPaisDetaIter.getLcBcos()));
					subTotalPaisConClaveImp.setiCcOper(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCcOper(),bRankPaisDetaIter.getLcOper()));
					subTotalPaisConClaveImp.setiCcImpUSD(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCcImpUSD(),bRankPaisDetaIter.getLcImporte()));
					subTotalPaisConClaveImp.setiCBcos(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCBcos(),bRankPaisDetaIter.getClBcos()));
					subTotalPaisConClaveImp.setiCOper(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCOper(),bRankPaisDetaIter.getClOper()));
					subTotalPaisConClaveImp.setiCImpUSD(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiCImpUSD(),bRankPaisDetaIter.getClImporte()));
					subTotalPaisConClaveImp.setiFOper(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiFOper(),bRankPaisDetaIter.getFiOper()));
					subTotalPaisConClaveImp.setiFImpUSD(ITradexUtil.addBigDecimal(subTotalPaisConClaveImp.getiFImpUSD(),bRankPaisDetaIter.getFiImporte()));
				}else if(bRankPaisDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_SIN_CLAVE)){
					subTotalPaisSinClaveImp.setNroCliente(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getNroCliente(),bRankPaisDetaIter.getTotCli()));
					subTotalPaisSinClaveImp.setTotalBcos(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getTotalBcos(),bRankPaisDetaIter.getTotBcos()));
					subTotalPaisSinClaveImp.setTotalOper(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getTotalOper(),bRankPaisDetaIter.getTotOper()));
					subTotalPaisSinClaveImp.setTotalImporte(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getTotalImporte(),bRankPaisDetaIter.getTotImporte()));
					subTotalPaisSinClaveImp.setiTeBcos(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiTeBcos(),bRankPaisDetaIter.getTxBcos()));
					subTotalPaisSinClaveImp.setiTeOper(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiTeOper(),bRankPaisDetaIter.getTxOper()));
					subTotalPaisSinClaveImp.setiTeImpUSD(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiTeImpUSD(),bRankPaisDetaIter.getTxImporte()));
					subTotalPaisSinClaveImp.setiCcBcos(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCcBcos(),bRankPaisDetaIter.getLcBcos()));
					subTotalPaisSinClaveImp.setiCcOper(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCcOper(),bRankPaisDetaIter.getLcOper()));
					subTotalPaisSinClaveImp.setiCcImpUSD(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCcImpUSD(),bRankPaisDetaIter.getLcImporte()));
					subTotalPaisSinClaveImp.setiCBcos(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCBcos(),bRankPaisDetaIter.getClBcos()));
					subTotalPaisSinClaveImp.setiCOper(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCOper(),bRankPaisDetaIter.getClOper()));
					subTotalPaisSinClaveImp.setiCImpUSD(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiCImpUSD(),bRankPaisDetaIter.getClImporte()));
					subTotalPaisSinClaveImp.setiFOper(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiFOper(),bRankPaisDetaIter.getFiOper()));
					subTotalPaisSinClaveImp.setiFImpUSD(ITradexUtil.addBigDecimal(subTotalPaisSinClaveImp.getiFImpUSD(),bRankPaisDetaIter.getFiImporte()));
				}
			}
		}
		
		// Total Pais
		for (BancoRankPaisResultado bRankPaisResIter : listaBPaisResultadoImportaciones) {
			totalPaisImp.setNroCliente(ITradexUtil.addBigDecimal(totalPaisImp.getNroCliente(),bRankPaisResIter.getNroCliente()));
			totalPaisImp.setTotalBcos(ITradexUtil.addBigDecimal(totalPaisImp.getTotalBcos(),bRankPaisResIter.getTotalBcos()));
			totalPaisImp.setTotalOper(ITradexUtil.addBigDecimal(totalPaisImp.getTotalOper(),bRankPaisResIter.getTotalOper()));
			totalPaisImp.setTotalImporte(ITradexUtil.addBigDecimal(totalPaisImp.getTotalImporte(),bRankPaisResIter.getTotalImporte()));
			totalPaisImp.setiTeBcos(ITradexUtil.addBigDecimal(totalPaisImp.getiTeBcos(),bRankPaisResIter.getiTeBcos()));
			totalPaisImp.setiTeOper(ITradexUtil.addBigDecimal(totalPaisImp.getiTeOper(),bRankPaisResIter.getiTeOper()));
			totalPaisImp.setiTeImpUSD(ITradexUtil.addBigDecimal(totalPaisImp.getiTeImpUSD(),bRankPaisResIter.getiTeImpUSD()));
			totalPaisImp.setiCcBcos(ITradexUtil.addBigDecimal(totalPaisImp.getiCcBcos(),bRankPaisResIter.getiCcBcos()));
			totalPaisImp.setiCcOper(ITradexUtil.addBigDecimal(totalPaisImp.getiCcOper(),bRankPaisResIter.getiCcOper()));
			totalPaisImp.setiCcImpUSD(ITradexUtil.addBigDecimal(totalPaisImp.getiCcImpUSD(),bRankPaisResIter.getiCcImpUSD()));
			totalPaisImp.setiCBcos(ITradexUtil.addBigDecimal(totalPaisImp.getiCBcos(),bRankPaisResIter.getiCBcos()));
			totalPaisImp.setiCOper(ITradexUtil.addBigDecimal(totalPaisImp.getiCOper(),bRankPaisResIter.getiCOper()));
			totalPaisImp.setiCImpUSD(ITradexUtil.addBigDecimal(totalPaisImp.getiCImpUSD(),bRankPaisResIter.getiCImpUSD()));
			totalPaisImp.setiFOper(ITradexUtil.addBigDecimal(totalPaisImp.getiFOper(),bRankPaisResIter.getiFOper()));
			totalPaisImp.setiFImpUSD(ITradexUtil.addBigDecimal(totalPaisImp.getiFImpUSD(),bRankPaisResIter.getiFImpUSD()));
		}
	}
	
	@Override
	public void generaPDFRankingPais(Integer impoExpo,
			FacesContext facesContext,
			List<BancoRankPaisResultado> listPaisResultadoImportacion,
			RankingPaisBusquedaForm filtros,
			BancoRankPaisResultado subTotalPaisConClave,
			BancoRankPaisResultado subTotalPaisSinClave,
			BancoRankPaisResultado totales,String strTipoArchivoExportacion) throws Exception {
		
		Map<String,Object> parametros = new HashMap<String, Object>();
		String strNombrePDF = "Ranking_Paises_";		
		parametros.put("titulo","RANKING PAISES");
		if (impoExpo==Constantes.TIPO_IMPORTACION_VAL){
			parametros.put("expoImpo","IMPORTACIONES");
			strNombrePDF+="IMPO_";
		}
		else if(impoExpo==Constantes.TIPO_EXPORTACION_VAL){
			parametros.put("expoImpo","EXPORTACIONES");
			strNombrePDF+="EXPO_";
		}
		else if(impoExpo==Constantes.TIPO_IMPOEXPO_VAL){
			parametros.put("expoImpo","IMPORTACIONES Y EXPORTACIONES");
			strNombrePDF+="IMPOEXPO_";
		}
		parametros.put("filPais",ITradexUtil.toString(filtros.getStrDescPais()));
		parametros.put("filClave",filtros.getStrExcluClave());
		parametros.put("filGrupo",filtros.getStrExcluGrupo());
		parametros.put("filFechaIni",filtros.getDtFechaIni());
		parametros.put("filFechaFin",filtros.getDtFechaFin());
		if(filtros.getLngTopPais()!=null && filtros.getLngTopPais() > 0)
			parametros.put("filTopBanco",filtros.getLngTopPais());
		parametros.put("filAladi",filtros.getStrExcluOpera());
		
		if(totales==null)totales=new BancoRankPaisResultado();
		if(subTotalPaisConClave==null)subTotalPaisConClave=new BancoRankPaisResultado();
		if(subTotalPaisSinClave==null)subTotalPaisSinClave=new BancoRankPaisResultado();
		
		parametros.put("subTotalConClaveCliente",subTotalPaisConClave.getNroCliente());
		parametros.put("subTotalConClaveBcos",subTotalPaisConClave.getTotalBcos());
		parametros.put("subTotalConClaveOper",subTotalPaisConClave.getTotalOper());
		parametros.put("subTotalConClaveImporte",subTotalPaisConClave.getTotalImporte());
		parametros.put("subTotalConClaveTeBcos",subTotalPaisConClave.getiTeBcos());
		parametros.put("subTotalConClaveTeOper",subTotalPaisConClave.getiTeOper());
		parametros.put("subTotalConClaveiTeImpUSD",subTotalPaisConClave.getiTeImpUSD());
		parametros.put("subTotalConClaveiCcBcos",subTotalPaisConClave.getiCcBcos());
		parametros.put("subTotalConClaveiCcOper",subTotalPaisConClave.getiCcOper());
		parametros.put("subTotalConClaveiCcImpUSD",subTotalPaisConClave.getiCcImpUSD());
		parametros.put("subTotalConClaveiCBcos",subTotalPaisConClave.getiCBcos());
		parametros.put("subTotalConClaveiCOper",subTotalPaisConClave.getiCOper());
		parametros.put("subTotalConClaveiCImpUSD",subTotalPaisConClave.getiCImpUSD());
		parametros.put("subTotalConClaveiFOper",subTotalPaisConClave.getiFOper());
		parametros.put("subTotalConClaveiFImpUSD",subTotalPaisConClave.getiFImpUSD());
				
		parametros.put("subTotalSinClaveCliente",subTotalPaisSinClave.getNroCliente());
		parametros.put("subTotalSinClaveBcos",subTotalPaisSinClave.getTotalBcos());
		parametros.put("subTotalSinClaveOper",subTotalPaisSinClave.getTotalOper());
		parametros.put("subTotalSinClaveImporte",subTotalPaisSinClave.getTotalImporte());
		parametros.put("subTotalSinClaveTeBcos",subTotalPaisSinClave.getiTeBcos());
		parametros.put("subTotalSinClaveTeOper",subTotalPaisSinClave.getiTeOper());
		parametros.put("subTotalSinClaveiTeImpUSD",subTotalPaisSinClave.getiTeImpUSD());
		parametros.put("subTotalSinClaveiCcBcos",subTotalPaisSinClave.getiCcBcos());
		parametros.put("subTotalSinClaveiCcOper",subTotalPaisSinClave.getiCcOper());
		parametros.put("subTotalSinClaveiCcImpUSD",subTotalPaisSinClave.getiCcImpUSD());
		parametros.put("subTotalSinClaveiCBcos",subTotalPaisSinClave.getiCBcos());
		parametros.put("subTotalSinClaveiCOper",subTotalPaisSinClave.getiCOper());
		parametros.put("subTotalSinClaveiCImpUSD",subTotalPaisSinClave.getiCImpUSD());
		parametros.put("subTotalSinClaveiFOper",subTotalPaisSinClave.getiFOper());
		parametros.put("subTotalSinClaveiFImpUSD",subTotalPaisSinClave.getiFImpUSD());
		
		parametros.put("totalCliente",totales.getNroCliente());
		parametros.put("totalBcos",totales.getTotalBcos());
		parametros.put("totalOper",totales.getTotalOper());
		parametros.put("totalImporte",totales.getTotalImporte());
		parametros.put("totalTeBcos",totales.getiTeBcos());
		parametros.put("totalTeOper",totales.getiTeOper());
		parametros.put("totaliTeImpUSD",totales.getiTeImpUSD());
		parametros.put("totaliCcBcos",totales.getiCcBcos());
		parametros.put("totaliCcOper",totales.getiCcOper());
		parametros.put("totaliCcImpUSD",totales.getiCcImpUSD());
		parametros.put("totaliCBcos",totales.getiCBcos());
		parametros.put("totaliCOper",totales.getiCOper());
		parametros.put("totaliCImpUSD",totales.getiCImpUSD());
		parametros.put("totaliFOper",totales.getiFOper());
		parametros.put("totaliFImpUSD",totales.getiFImpUSD());
		
		strNombrePDF=strNombrePDF+"_"+"[FechaInformacion]";
		if(strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_PDF)){
			ITradexUtil.exportPDF(parametros, listPaisResultadoImportacion, "/xmlReport/banco/rankingPaises/rankingPaises.jasper", strNombrePDF);	
		}else if(strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_XLS)){
			parametros.put("listPaisResultadoImportacion", listPaisResultadoImportacion);
			ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/banco/rankingPaises/rankingPaises_Excel.jasper", strNombrePDF);
		}
	}

	private List<BancoRankPaisResultado> formatListRankingPais(
			List<BancoRankPaisDetalle> listBanoRankPaisDet) {
		List<BancoRankPaisResultado> lstBPaisResultado = null;
		List<BancoRankPaisDetalle> listaClaves = new ArrayList<BancoRankPaisDetalle>() ;
		if (listBanoRankPaisDet != null) {
			lstBPaisResultado = new ArrayList<BancoRankPaisResultado>();

			BigDecimal nroCliente = new BigDecimal(0);
			BigDecimal totalBcos = new BigDecimal(0);
			BigDecimal totalOper = new BigDecimal(0);
			BigDecimal totalImporte = new BigDecimal(0);
			BigDecimal iTeBcos = new BigDecimal(0);
			BigDecimal iTeOper = new BigDecimal(0);
			BigDecimal iTeImpUSD = new BigDecimal(0);
			BigDecimal iCcBcos = new BigDecimal(0);
			BigDecimal iCcOper = new BigDecimal(0);
			BigDecimal iCcImpUSD = new BigDecimal(0);
			BigDecimal iCBcos = new BigDecimal(0);
			BigDecimal iCOper = new BigDecimal(0);
			BigDecimal iCImpUSD = new BigDecimal(0);
			BigDecimal iFOper = new BigDecimal(0);
			BigDecimal iFImpUSD = new BigDecimal(0);
			BancoRankPaisDetalle tmpBancoRankPaisDetSig=new BancoRankPaisDetalle();

			// 02.Se arma el subListado
			for (int i = 0; i < listBanoRankPaisDet.size(); i++) {
				BancoRankPaisDetalle bancoRankPaisDetalle = listBanoRankPaisDet.get(i);
				if(i < (listBanoRankPaisDet.size()-1))
					tmpBancoRankPaisDetSig=listBanoRankPaisDet.get(i+1);
				
				nroCliente=ITradexUtil.addBigDecimal(nroCliente,bancoRankPaisDetalle.getTotCli());
				totalBcos=ITradexUtil.addBigDecimal(totalBcos,bancoRankPaisDetalle.getTotBcos());
				totalOper=ITradexUtil.addBigDecimal(totalOper,bancoRankPaisDetalle.getTotOper());
				totalImporte=ITradexUtil.addBigDecimal(totalImporte,bancoRankPaisDetalle.getTotImporte());
				iTeBcos=ITradexUtil.addBigDecimal(iTeBcos,bancoRankPaisDetalle.getTxBcos());
				iTeOper=ITradexUtil.addBigDecimal(iTeOper,bancoRankPaisDetalle.getTxOper());
				iTeImpUSD=ITradexUtil.addBigDecimal(iTeImpUSD,bancoRankPaisDetalle.getTxImporte());
				iCcBcos=ITradexUtil.addBigDecimal(iCcBcos,bancoRankPaisDetalle.getLcBcos());
				iCcOper=ITradexUtil.addBigDecimal(iCcOper,bancoRankPaisDetalle.getLcOper());
				iCcImpUSD=ITradexUtil.addBigDecimal(iCcImpUSD,bancoRankPaisDetalle.getLcImporte());
				iCBcos=ITradexUtil.addBigDecimal(iCBcos,bancoRankPaisDetalle.getClBcos());
				iCOper=ITradexUtil.addBigDecimal(iCOper,bancoRankPaisDetalle.getClOper());
				iCImpUSD=ITradexUtil.addBigDecimal(iCImpUSD,bancoRankPaisDetalle.getClImporte());
				iFOper=ITradexUtil.addBigDecimal(iFOper,bancoRankPaisDetalle.getFiOper());
				iFImpUSD=ITradexUtil.addBigDecimal(iFImpUSD,bancoRankPaisDetalle.getFiImporte());
				listaClaves.add(bancoRankPaisDetalle);
				
				if (!tmpBancoRankPaisDetSig.getCodPais().equals(bancoRankPaisDetalle.getCodPais()) || i==(listBanoRankPaisDet.size()-1) ) {
					BancoRankPaisResultado bPaisResultado = new BancoRankPaisResultado(
							bancoRankPaisDetalle.getCodPais(),
							bancoRankPaisDetalle.getDescPais(), nroCliente,
							totalBcos, totalOper, totalImporte, iTeBcos,
							iTeOper, iTeImpUSD, iCcBcos, iCcOper, iCcImpUSD,
							iCBcos, iCOper, iCImpUSD, iFOper, iFImpUSD);
					bPaisResultado.setListaClaves(listaClaves);
					lstBPaisResultado.add(bPaisResultado);
					
					nroCliente = new BigDecimal(0);
					totalBcos = new BigDecimal(0);
					totalOper = new BigDecimal(0);
					totalImporte = new BigDecimal(0);
					iTeBcos = new BigDecimal(0);
					iTeOper = new BigDecimal(0);
					iTeImpUSD = new BigDecimal(0);
					iCcBcos = new BigDecimal(0);
					iCcOper = new BigDecimal(0);
					iCcImpUSD = new BigDecimal(0);
					iCBcos = new BigDecimal(0);
					iCOper = new BigDecimal(0);
					iCImpUSD = new BigDecimal(0);
					iFOper = new BigDecimal(0);
					iFImpUSD = new BigDecimal(0);
					listaClaves = new ArrayList<BancoRankPaisDetalle>();
				}
			}
		}
		return lstBPaisResultado;
	}
}